home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 October: Mac OS SDK / Dev.CD Oct 97 SDK1.toast / Development Kits (Disc 1) / Color Picker SDK / Sample Code / ScrapPicker Sample / Sources ƒ / PickerCommonDraw.c < prev    next >
Encoding:
Text File  |  1997-06-13  |  3.7 KB  |  174 lines  |  [TEXT/CWIE]

  1. /*
  2.     File:        PickerCommonDraw.c
  3.     Copyright:    © 1996-1997 by Apple Computer, Inc., all rights reserved.
  4. */
  5.  
  6.  
  7. //===============================================================================
  8. //
  9. //                                 PickerCommonDraw.c
  10. //
  11. //===============================================================================
  12.  
  13.  
  14. #include <Memory.h>                    // <-- System interfaces.
  15. #include <ColorPicker.h>
  16. #include "PickerCommon.h"            // <-- Project interfaces.
  17.  
  18.  
  19. static void DarkenColor ( RGBColor *color );
  20.  
  21.  
  22. //=====================================================================  Functions
  23. //---------------------------------------------------------------------  DropRectShadow
  24.  
  25. void DropRectShadow (Rect *theRect, SInt16 dropDist, Boolean useColor)
  26. {
  27.     RGBColor    grayColor;
  28.     Rect        dropShadow;
  29.     RgnHandle    wasClip, newClip;
  30.     SInt16        i;
  31.     
  32.     BackColor(whiteColor);
  33.     
  34.     wasClip = NewRgn();
  35.     if (!wasClip)
  36.         return;
  37.     GetClip(wasClip);
  38.     
  39.     newClip = NewRgn();
  40.     if (!newClip)
  41.         return;
  42.     InsetRect(theRect, 1, 1);
  43.     RectRgn(newClip, theRect);
  44.     InsetRect(theRect, -1, -1);
  45.     DiffRgn(wasClip, newClip, newClip);
  46.     SetClip(newClip);
  47.     
  48.     dropShadow = *theRect;
  49.     OffsetRect(&dropShadow, dropDist, dropDist);
  50.     
  51.     if (useColor)
  52.     {
  53.         grayColor.red = 0x8000;
  54.         grayColor.green = 0x8000;
  55.         grayColor.blue = 0x8000;
  56.         OpColor(&grayColor);
  57.         PenMode(blend);
  58.         
  59.         grayColor.red = 0xE000;
  60.         grayColor.green = 0xE000;
  61.         grayColor.blue = 0xE000;
  62.         
  63.         for (i = 0; i < 4; i++)
  64.         {
  65.             RGBForeColor(&grayColor);
  66.             InsetRect(&dropShadow, 1, 1);
  67.             PaintRoundRect(&dropShadow, 6, 6);
  68.             DarkenColor( &grayColor );
  69.         }
  70.         
  71.         ForeColor(blackColor);
  72.         PenMode(srcCopy);
  73.     }
  74.     else
  75.     {
  76.         Pattern        blackPattern;
  77.         Pattern        grayPattern;
  78.         StuffHex(&blackPattern,"\pFFFFFFFFFFFFFFFF");
  79.         StuffHex(&grayPattern, "\p2288228822882288");
  80.         PenPat(&grayPattern);
  81.         InsetRect(&dropShadow, 1, 1);
  82.         PaintRect(&dropShadow);
  83.         PenPat(&blackPattern);
  84.     }
  85.     
  86.     SetClip(wasClip);
  87.     DisposeRgn(wasClip);
  88.     DisposeRgn(newClip);
  89. }
  90.  
  91. //--------------------------------------------------------------------  CreateOffScreenGWorld
  92. // Dims the color passed in towards black.
  93.  
  94. static void DarkenColor( RGBColor *color )
  95. {
  96.     #define        kGrayStep    0x0C00
  97.     
  98.     if (color->red >= kGrayStep)
  99.         color->red -= kGrayStep;
  100.     else
  101.         color->red = 0x0000;
  102.     
  103.     if (color->green >= kGrayStep)
  104.         color->green -= kGrayStep;
  105.     else
  106.         color->green = 0x0000;
  107.     
  108.     if (color->blue >= kGrayStep)
  109.         color->blue -= kGrayStep;
  110.     else
  111.         color->blue = 0x0000;
  112. }
  113.  
  114. //---------------------------------------------------------------------  SetPatternToColor
  115. // Set the pattern pat to best represent the color rgb. 
  116. // If we're on a color machine, use MakeRGBPat, 
  117. // otherwise pat is really a Pattern **, so set it the best B&W pattern.
  118.  
  119. void SetPatternToColor (PixPatHandle pat, RGBColor *rgb, Boolean hasColor)
  120. {
  121.     if (!pat)
  122.         return;
  123.     
  124.     if (hasColor)
  125.     {
  126.         MakeRGBPat(pat, rgb);
  127.         check(QDError() == noErr);
  128.     }
  129.     else
  130.     {
  131.         HSLColor    hsl;
  132.         Pattern        tempPat;
  133.         
  134.         RGB2HSL(rgb, &hsl);
  135.         GetGrayPattern(hsl.lightness, &tempPat);
  136.         
  137.         HLock((Handle)pat);
  138.         BlockMoveData(&tempPat, *pat, 8);
  139.         HUnlock((Handle)pat);
  140.     }
  141. }
  142.  
  143. //---------------------------------------------------------------------  GetGrayPattern
  144. // Find a B&W pattern that best matches lightness (0 == black, 
  145. // 65535 == white) and store it in "pat".
  146.  
  147. void GetGrayPattern (unsigned short lightness, Pattern *pat)
  148. {
  149.     short        index;
  150.     
  151.     index = (lightness / 8192);
  152.     switch (index)
  153.     {
  154.         case 0:        // 0-8192
  155.         case 1:        // 8192-16383
  156.         case 2:        // 16384-24576
  157.         case 3:        // 24576-32767
  158.         GetIndPattern(pat, sysPatListID, index + 1);
  159.         break;
  160.         
  161.         case 4:        // 32768-40959
  162.         case 5:        // 40960-49151
  163.         case 6:        // 49152-57343
  164.         case 7:        // 57344-65535
  165.         GetIndPattern(pat, sysPatListID, 27 - index);
  166.         break;
  167.         
  168.         default:
  169.             check(true);
  170.             break;
  171.     }
  172. }
  173.  
  174.